home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
011-020
/
amok11
/
r.o.m.
/
m2sources
/
graph.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
52KB
|
1,534 lines
IMPLEMENTATION MODULE Graph;
(*
Created: 02/88
Changed: 08.02.88/03.03.88/10.3.88/29.3.88/5.8.88/10.9.88 by
Stefan Salewski
Stolper Weg 3
2160 Stade West-Germany
Tel: 04141/61130
Note: compiled with AMIGA Modula-2 System by AMSoft version from 5.5.88
*)
FROM Arts IMPORT Assert,TermProcedure;
FROM MyMathLibLong IMPORT unit,AngleUnit;
FROM Formelauswertung IMPORT AssignFFP,FFPBerechnung,ClearVar,varListFFP,
DefFormel,Formelnummer;
FROM Exec IMPORT GetMsg,ReplyMsg,MessagePtr,WaitPort,CopyMem,MemReqs,
MemReqSet,AllocMem,UByte;
FROM Dos IMPORT Delay;
FROM InputEvent IMPORT Qualifiers,QualifierSet;
FROM Intuition IMPORT NewWindow,WindowPtr,SetMenuStrip,MenuPtr,selectDown,
WindowToFront,WindowToBack,MenuItemPtr,menuNull,Border,DrawBorder,
ItemAddress,IDCMPFlagSet,IntuiMessagePtr,IntuiText,PrintIText,selectUp,
CloseWindow,IDCMPFlags,WindowFlagSet,ModifyIDCMP,ReportMouse,SetPointer,
WindowFlags,ScreenFlagSet,ScreenFlags,OpenWindow,ClearMenuStrip,
ClearPointer,SizeWindow,DisplayBeep,ActivateWindow;
FROM Graphics IMPORT jam1,SetDrMd,Move,Draw,SetAPen,SetBPen,RectFill;
FROM MyRemember IMPORT RememberNodePtr;
FROM MakeMenu IMPORT MenuRecord,InitMenu,FreeMenu,MenuNum,ItemNum,SubNum;
FROM StringInput IMPORT Datum,Buffer,AskForStrings;
FROM Preference IMPORT CharSize;
FROM MyStrings IMPORT Assign;
FROM StringInOut IMPORT OpenNewWindow,CloseNewWindow,ReadString,SetPos,
WriteString,inputOK,Flags,FlagSet,ClearWindow;
FROM FormelausFText IMPORT GetFehlertext;
FROM SYSTEM IMPORT FFP, BYTE,ADR,ADDRESS,REG;
FROM Printer IMPORT Special,SpecialSet;
FROM Conversions IMPORT StrToVal,ValToStr;
FROM Hardcopy IMPORT DumpRPort;
FROM MyFFPConversions IMPORT RealToStr;
VAR
wPtr:WindowPtr;
rememberkey:RememberNodePtr;
eingaben:ARRAY[0..3] OF Datum;
PROCEDURE CleanupGraph;
BEGIN
IF wPtr#NIL THEN
ClearMenuStrip(wPtr);
IF rememberkey#NIL THEN
FreeMenu(rememberkey);
rememberkey:=NIL
END;
CloseWindow(wPtr);
wPtr:=NIL
END
END CleanupGraph;
PROCEDURE Graf;
CONST
zwei=2;
MaxHorzRes=640;
Zahlenstellen=9;
DeziStellen=3;
MaxRaster=8;
OutOfRange=1001;(* spezielle Fehlernummern*)
OutOfDefArea=1002;
TYPE
TypA=(mmDef,mmVar,defDef,defVar);
TypB=(vertC,vertV,horzC,horzV);
Bildsp= RECORD
xWert:FFP;
wert:FFP;
intWert:[-1..512];
fN:CARDINAL;
END;
Formelstring=ARRAY UByte OF CHAR;
VAR
actWSize:INTEGER;
maxVertRes:INTEGER;
charWidth,charHeight,vertRes,horzRes:INTEGER;
ffpVertRes:FFP;
startw,endw:FFP;
firstMenu:MenuPtr;
j:[0..MaxHorzRes];
bildspeicher:ARRAY[0..MaxHorzRes] OF Bildsp;
max,newMax,min,newMin:FFP;
c:CHAR;
raster:[-1..MaxRaster];(* Raster:=4 <=> Jeder 4. Punkt wird berechnet *)
newW:NewWindow;
onlyLong:BOOLEAN;
ende:BOOLEAN;
minMaxFest:BOOLEAN;
minMaxDef:BOOLEAN;(* Min und Max wurde eingegeben*)
firstTime:BOOLEAN;
horzVersch,vertVersch:[-1..99];
xLinePos,yLinePos:INTEGER;
rahmen,gitter,beschriftung:BOOLEAN;
backgroundColor,drawingColor,textColor:[0..3];
density:SpecialSet;
standartXSize,standartYSize:[1..4];
xUnterteilung,yUnterteilung:UByte;
defAreaSet:BOOLEAN;
def1,def2:FFP;
(*************************************************************************)
PROCEDURE FFPToStr(x:FFP;VAR str:ARRAY OF CHAR;left:BOOLEAN);
(* Wenn ABS(x)<1.0 dann wird Exponentialdarstellung gewaehlt *)
VAR exp,l:[-1..1];
BEGIN
IF ABS(x)< 1.0 THEN
exp:=-1
ELSE
exp:=1
END;
IF left THEN
l:=-1
ELSE
l:=1
END;
RealToStr(x,str,l*DeziStellen,exp*DeziStellen);
END FFPToStr;
(*************************************************************************)
PROCEDURE GetIntervall(s1,s2:Buffer;VAR x1,x2:FFP):BOOLEAN;
VAR fN:CARDINAL;
BEGIN
fN:=1; (* muss #0 sein *)
IF DefFormel(9,s1,TRUE,onlyLong)=0 THEN
FFPBerechnung(9,x1,fN);
IF fN=0 THEN
IF DefFormel(9,s2,TRUE,onlyLong)=0 THEN
FFPBerechnung(9,x2,fN);
END;
END;
END;
RETURN (fN=0) AND (x1<x2);
END GetIntervall;
(*************************************************************************)
PROCEDURE GetFormel(nummer:Formelnummer;s:Buffer):CARDINAL;
BEGIN
RETURN DefFormel(nummer,s,TRUE,onlyLong);
END GetFormel;
(*************************************************************************)
PROCEDURE GetLaufvariable(s:Buffer):BOOLEAN;
BEGIN
RETURN ((s[1]= 0C) AND AssignFFP(s[0],0.0));
END GetLaufvariable;
(*************************************************************************)
PROCEDURE OpenGraphicWindow;
BEGIN
WITH newW DO
leftEdge:=0;
topEdge:=0;
width:=MaxHorzRes;
height:=maxVertRes;
detailPen:=0;
blockPen:=1;
idcmpFlags:=IDCMPFlagSet{menuPick};
flags:=WindowFlagSet{activate,borderless,noCareRefresh,windowDepth};
type:=ScreenFlagSet{wbenchScreen};
firstGadget:=NIL;
checkMark:=NIL;
title:=NIL;
screen:=NIL;
bitMap:=NIL;
minWidth:=640;
minHeight:=256;
maxWidth:=640;
maxHeight:=512;
END;
wPtr:=OpenWindow(newW);
Assert(wPtr#NIL,ADR('Graph:Cannot Open Window'));
END OpenGraphicWindow;
(*************************************************************************)
PROCEDURE Init;
BEGIN
raster:=1;
ende:=FALSE;
minMaxFest:=FALSE;
minMaxDef:=FALSE;
xUnterteilung:=255;
yUnterteilung:=255;
firstTime:=TRUE;
backgroundColor:=0;
drawingColor:=1;
textColor:=1;
gitter:=FALSE;
rahmen:=TRUE;
beschriftung:=TRUE;
defAreaSet:=FALSE;
maxVertRes:=180;(*wird spaeter auf WBScreenHeight vergroessert (wg USA)*)
density:=SpecialSet{};
standartXSize:=1;
standartYSize:=1;
onlyLong:=FALSE;
unit:=rad;
END Init;
(*************************************************************************)
PROCEDURE InitGraphicmenu;
VAR
menurecords:ARRAY[0..3] OF MenuRecord;
BEGIN
WITH menurecords[0] DO
mname:='Aktionen';
anzahlItems:=9;
WITH mItems[0] DO
iname:='Neue Funktion';
commandKey:='N';
anzahlSubitems:=0;
END;
WITH mItems[1] DO
iname:='Schirm löschen';
commandKey:='D';
anzahlSubitems:=0;
END;
WITH mItems[2] DO
iname:='Min&Max';
anzahlSubitems:=2;
subrecords[0].subName:='var.';
subrecords[0].commandKey:='v';
subrecords[1].subName:='const';
subrecords[1].commandKey:='c';
END;
WITH mItems[3] DO
iname:='Def.Gebiet Einschr.';
commandKey:=0C;
anzahlSubitems:=2;
subrecords[0].subName:='Nein';
subrecords[0].commandKey:='N';
subrecords[1].subName:='Ja';
subrecords[1].commandKey:='J';
END;
WITH mItems[4] DO
iname:='X-Intervalle';
commandKey:=0C;
anzahlSubitems:=2;
subrecords[0].subName:='var.';
subrecords[0].commandKey:=0C;
subrecords[1].subName:='const';
subrecords[1].commandKey:=0C;
END;
WITH mItems[5] DO
iname:='Y-Intervalle';
commandKey:=0C;
anzahlSubitems:=2;
subrecords[0].subName:='var.';
subrecords[0].commandKey:=0C;
subrecords[1].subName:='const';
subrecords[1].commandKey:=0C;
END;
WITH mItems[6] DO
iname:='Malen';
commandKey:=0C;
anzahlSubitems:=0;
END;
WITH mItems[7] DO
iname:='Funktionsstring';
commandKey:=0C;
anzahlSubitems:=0;
END;
WITH mItems[8] DO
iname:='Ins Hauptmenü';
commandKey:='E';
anzahlSubitems:=0;
END;
END;
WITH menurecords[1] DO
mname:='Parameter';
anzahlItems:=8;
WITH mItems[0] DO
iname:='Hintergrundfarbe';
anzahlSubitems:=4;
subrecords[0].subName:=' 0';
subrecords[0].commandKey:=0C;
subrecords[1].subName:=' 1';
subrecords[1].commandKey:=0C;
subrecords[2].subName:=' 2';
subrecords[2].commandKey:=0C;
subrecords[3].subName:=' 3';
subrecords[3].commandKey:=0C;
END;
WITH mItems[1] DO
iname:='Zeichenfarbe';
anzahlSubitems:=4;
subrecords[0].subName:=' 1';
subrecords[0].commandKey:=0C;
subrecords[1].subName:=' 2';
subrecords[1].commandKey:=0C;
subrecords[2].subName:=' 3';
subrecords[2].commandKey:=0C;
subrecords[3].subName:=' 0';
subrecords[3].commandKey:=0C;
END;
WITH mItems[2] DO
iname:='TextFarbe';
anzahlSubitems:=4;
subrecords[0].subName:=' 1';
subrecords[0].commandKey:=0C;
subrecords[1].subName:=' 2';
subrecords[1].commandKey:=0C;
subrecords[2].subName:=' 3';
subrecords[2].commandKey:=0C;
subrecords[3].subName:=' 0';
subrecords[3].commandKey:=0C;
END;
WITH mItems[3] DO
iname:='Auflösung';
anzahlSubitems:=4;
subrecords[0].subName:='640';
subrecords[0].commandKey:='1';
subrecords[1].subName:='320';
subrecords[1].commandKey:='2';
subrecords[2].subName:='160';
subrecords[2].commandKey:='3';
subrecords[3].subName:='80';
subrecords[3].commandKey:='4';
END;
WITH mItems[4] DO
iname:='Winkeleinheit';
anzahlSubitems:=3;
subrecords[0].subName:='Rad';
subrecords[0].commandKey:=0C;
subrecords[1].subName:='Deg';
subrecords[1].commandKey:=0C;
subrecords[2].subName:='Gon';
subrecords[2].commandKey:=0C;
END;
WITH mItems[5] DO
iname:='Gitter';
anzahlSubitems:=2;
subrecords[0].subName:='Aus';
subrecords[0].commandKey:=0C;
subrecords[1].subName:='Ein';
subrecords[1].commandKey:=0C;
END;
WITH mItems[6] DO
iname:='Rahmen';
anzahlSubitems:=2;
subrecords[0].subName:='Ja';
subrecords[0].commandKey:=0C;
subrecords[1].subName:='Nein';
subrecords[1].commandKey:=0C;
END;
WITH mItems[7] DO
iname:='Beschriftung';
anzahlSubitems:=2;
subrecords[0].subName:='Ja';
subrecords[0].commandKey:=0C;
subrecords[1].subName:='Nein';
subrecords[1].commandKey:=0C;
END;
END;
WITH menurecords[2] DO
mname:='Extern';
anzahlItems:=8;
WITH mItems[0] DO
iname:='Save';
commandKey:='S';
anzahlSubitems:=0;
END;
WITH mItems[1] DO
iname:='Load';
commandKey:='L';
anzahlSubitems:=0;
END;
WITH mItems[2] DO
iname:='Hardcopy Standart';
commandKey:='H';
anzahlSubitems:=0;
END;
WITH mItems[3] DO
iname:='Hardcopy Groß';
commandKey:='G';
anzahlSubitems:=0;
END;
WITH mItems[4] DO
iname:='Hardcopy Pref.';
commandKey:='P';
anzahlSubitems:=0;
END;
WITH mItems[5] DO
iname:='Druckdichte';
anzahlSubitems:=5;
subrecords[0].subName:=' 0';
subrecords[0].commandKey:=0C;
subrecords[1].subName:=' 1';
subrecords[1].commandKey:=0C;
subrecords[2].subName:=' 2';
subrecords[2].commandKey:=0C;
subrecords[3].subName:=' 3';
subrecords[3].commandKey:=0C;
subrecords[4].subName:=' 4';
subrecords[4].commandKey:=0C;
END;
WITH mItems[6] DO
iname:='Standartgröße x';
anzahlSubitems:=4;
subrecords[0].subName:=' 1';
subrecords[0].commandKey:=0C;
subrecords[1].subName:=' 2';
subrecords[1].commandKey:=0C;
subrecords[2].subName:=' 3';
subrecords[2].commandKey:=0C;
subrecords[3].subName:=' 4';
subrecords[3].commandKey:=0C;
END;
WITH mItems[7] DO
iname:='Standartgröße y';
anzahlSubitems:=4;
subrecords[0].subName:=' 1';
subrecords[0].commandKey:=0C;
subrecords[1].subName:=' 2';
subrecords[1].commandKey:=0C;
subrecords[2].subName:=' 3';
subrecords[2].commandKey:=0C;
subrecords[3].subName:=' 4';
subrecords[3].commandKey:=0C;
END;
END;
WITH menurecords[3] DO
mname:='Window';
anzahlItems:=2;
WITH mItems[0] DO
iname:='Nach Hinten';
commandKey:='B';
anzahlSubitems:=0;
END;
WITH mItems[1]DO
iname:='Nach Vorn';
commandKey:='F';
anzahlSubitems:=0;
END;
END;
InitMenu(menurecords,firstMenu,rememberkey);
END InitGraphicmenu;
(*************************************************************************)
PROCEDURE ClearScreen;
TYPE XY=RECORD
x:INTEGER;
y:INTEGER
END;
VAR oldAPen:CARDINAL;
borko:ARRAY[0..4] OF XY;
frame:Border;
BEGIN
oldAPen:=wPtr^.rPort^.fgPen;
SetAPen(wPtr^.rPort,backgroundColor);
RectFill(wPtr^.rPort,0,0,MaxHorzRes-1,maxVertRes-1);
IF rahmen THEN
borko[0].x:=0;
borko[0].y:=0;
borko[1].x:=MaxHorzRes-1;
borko[1].y:=0;
borko[2].x:=MaxHorzRes-1;
borko[2].y:=maxVertRes-1;
borko[3].x:=0;
borko[3].y:=maxVertRes-1;
borko[4].x:=0;
borko[4].y:=0;
WITH frame DO
leftEdge:=0;
topEdge:=0;
frontPen:=textColor;
backPen:=backgroundColor;
drawMode:=jam1;
count:=5;
xy:=ADR(borko[0].x);
nextBorder:=NIL
END;
DrawBorder(wPtr^.rPort,ADR(frame),0,0)
END;
SetAPen(wPtr^.rPort,oldAPen);
IF minMaxDef THEN
min:=newMin;
max:=newMax;
minMaxFest:=TRUE
ELSE
minMaxFest:=FALSE
END;
firstTime:=TRUE;
END ClearScreen;
(*************************************************************************)
PROCEDURE RespondMessage;
VAR
class:IDCMPFlagSet;
code:CARDINAL;
msgPtr:IntuiMessagePtr;
PROCEDURE MenuReaction;
VAR
menuNr,itemNr,subNr:CARDINAL;
menuIPtr:MenuItemPtr;
PROCEDURE DatenEinlesen():BOOLEAN;
VAR fN:CARDINAL;
windowTitel:Buffer;
error:(noError,cancel,intervall,laufvariable);
BEGIN
fN:=1; (* muss # 0 sein *)
error:=noError;
windowTitel:='Werte eingeben und OK anklicken !';
REPEAT
IF firstTime THEN
IF AskForStrings(windowTitel,4,eingaben) THEN
IF GetLaufvariable(eingaben[1].buffer) THEN
IF GetIntervall(eingaben[2].buffer,eingaben[3].buffer,
startw,endw) THEN
fN:=GetFormel(2,eingaben[0].buffer);
ELSE
error:=intervall
END;
ELSE
error:=laufvariable;
END;
ELSE
error:=cancel
END
ELSE
IF AskForStrings(windowTitel,2,eingaben) THEN
IF GetLaufvariable(eingaben[1].buffer) THEN
fN:=GetFormel(2,eingaben[0].buffer);
ELSE
error:=laufvariable
END
ELSE
error:=cancel
END
END;
IF error=laufvariable THEN
windowTitel:= 'Laufvariable ungültig'
ELSIF error =intervall THEN
windowTitel:=('Grenzen ungueltig')
ELSIF fN#0 THEN
GetFehlertext(fN,windowTitel);
END;
UNTIL (fN=0) OR (error=cancel);
ClearVar(eingaben[1].buffer[0]);
RETURN error#cancel;
END DatenEinlesen;
(*************************************************************************)
PROCEDURE WerteBerechnen;
VAR
j,h:[-1..MaxHorzRes];
x,increment:FFP;
oK:BOOLEAN;
c:CHAR;
BEGIN
c:=eingaben[1].buffer[0];
x:=startw;
increment:=FFP(raster);
increment:=(endw-startw)/FFP(horzRes)*increment;
j:=0;
h:=horzRes-1;
WHILE j < h DO
bildspeicher[j].xWert:=x;
IF NOT defAreaSet OR ((x>=def1) AND (x<=def2)) THEN
(*oK:=AssignFFP(c,x);*)
varListFFP[c]:=x;
FFPBerechnung(2,bildspeicher[j].wert,bildspeicher[j].fN)
ELSE
bildspeicher[j].fN:=OutOfDefArea
END;
x:=x+increment;
INC(j,raster);
END;
bildspeicher[h].xWert:=endw;
IF NOT defAreaSet OR ((endw>=def1) AND (endw<=def2)) THEN
oK:=AssignFFP(c,endw);
FFPBerechnung(2,bildspeicher[h].wert,bildspeicher[h].fN)
ELSE
bildspeicher[h].fN:=OutOfDefArea
END;
ClearVar(c);
END WerteBerechnen;
(*************************************************************************)
PROCEDURE MinMaxBestimmen():BOOLEAN;
VAR i,h:[-1..MaxHorzRes];
BEGIN
h:=horzRes-1;
i:=0;
WHILE (bildspeicher[i].fN # 0) AND (i< horzRes) DO
INC(i,raster);
END;
IF i< horzRes THEN
min:=bildspeicher[i].wert;
max:= bildspeicher[i].wert;
INC(i,raster);
WHILE i<h DO
IF bildspeicher[i].fN=0 THEN
IF bildspeicher[i].wert > max THEN
max:=bildspeicher[i].wert
ELSIF bildspeicher[i].wert < min THEN
min:= bildspeicher[i].wert
END
END;
INC(i,raster);
END;
IF bildspeicher[h].fN=0 THEN
IF bildspeicher[h].wert > max THEN
max:=bildspeicher[h].wert
ELSIF bildspeicher[h].wert < min THEN
min:= bildspeicher[h].wert
END
END;
IF min = max THEN
min:=min-1.0;
max:=max+1.0;
END;
RETURN TRUE
ELSE
RETURN FALSE;
END;
END MinMaxBestimmen;
(*************************************************************************)
PROCEDURE Verschiebung;
BEGIN
IF endw<=0.0 THEN
horzVersch:=zwei
ELSE
horzVersch:=Zahlenstellen*charWidth+zwei
END;
IF max<=0.0 THEN
vertVersch:=charHeight+zwei
ELSE
vertVersch:=zwei
END;
END Verschiebung;
(*************************************************************************)
PROCEDURE Text;
TYPE ex=(ma,mi,sw,ew);
VAR i:ex;
l:INTEGER;
left:BOOLEAN;
beschriftung:ARRAY[ma..ew] OF RECORD
w:ARRAY[0..Zahlenstellen] OF CHAR;
x,y:INTEGER;
END;
myText:IntuiText;
error:BOOLEAN;
BEGIN
left:=endw<=0.0;
FFPToStr(max,beschriftung[ma].w,left);
FFPToStr(min,beschriftung[mi].w,left);
FFPToStr(startw,beschriftung[sw].w,TRUE);
FFPToStr(endw,beschriftung[ew].w,FALSE);
IF endw <=0.0 THEN
beschriftung[ma].x:=xLinePos+1;
ELSE
beschriftung[ma].x:=xLinePos-charWidth*Zahlenstellen-1;
END;
beschriftung[mi].x:=beschriftung[ma].x;
IF max>0.0 THEN
beschriftung[ma].y:=vertVersch
ELSE
beschriftung[ma].y:=vertVersch+2;
END;
IF min>=0.0 THEN
beschriftung[mi].y:=vertRes-1+vertVersch-charHeight
ELSE
beschriftung[mi].y:=vertRes-1+vertVersch-charHeight+zwei
END;
IF max <= 0.0 THEN
beschriftung[sw].y:= yLinePos-charHeight;
ELSE
beschriftung[sw].y:=yLinePos+2;
END;
beschriftung[ew].y:=beschriftung[sw].y;
beschriftung[sw].x:=horzVersch;
beschriftung[ew].x:=horzVersch+horzRes-1-Zahlenstellen*charWidth;
FOR i:= ma TO ew DO
WITH myText DO
frontPen:=textColor;
backPen:=backgroundColor;
drawMode:=jam1;
leftEdge:=0;
topEdge:=0;
iTextFont:=NIL;
iText:=ADR(beschriftung[i].w);
nextText:=NIL;
END;
PrintIText(wPtr^.rPort,ADR(myText),beschriftung[i].x,
beschriftung[i].y);
END;
END Text;
(*************************************************************************)
PROCEDURE Stauchen;
VAR i,h:[-1..MaxHorzRes];
faktor:FFP;
help:FFP;
BEGIN
h:=horzRes-1;
faktor:=(ffpVertRes-1.0)/(max-min);
i:=0;
WHILE i<h DO
IF bildspeicher[i].fN=0 THEN
help:=(bildspeicher[i].wert-min)*faktor;
IF (help>=0.0) AND (help<ffpVertRes) THEN
bildspeicher[i].intWert:=INTEGER(help+0.5)
ELSE
bildspeicher[i].fN:=OutOfRange
END
END;
INC(i,raster)
END;
IF bildspeicher[h].fN=0 THEN
help:=(bildspeicher[h].wert-min)*faktor;
IF (help>=0.0) AND (help<ffpVertRes) THEN
bildspeicher[h].intWert:=INTEGER(help+0.5)
ELSE
bildspeicher[h].fN:=OutOfRange
END
END;
END Stauchen;
(*************************************************************************)
PROCEDURE ZeichneFktn;
VAR
position,v:[-1..512];(* Start at -1 to be an INTEGER *)
jjj,h:[-1..MaxHorzRes];
PROCEDURE WriteErrors;
CONST Zeilen=20;
VAR
w:WindowPtr;
msgPtr:IntuiMessagePtr;
text:ARRAY[0..50] OF CHAR;
str:ARRAY[0..20] OF CHAR;
i,h:[-1..MaxHorzRes];
closeIt:BOOLEAN;
BEGIN
i:=0;
h:=horzRes-1;
closeIt:=FALSE;
WHILE (i<=h) AND ((bildspeicher[i].fN=0) OR
(bildspeicher[i].fN=OutOfDefArea)) DO
INC(i,raster)
END;
IF i<=h THEN
OpenNewWindow(w,0,0,58,Zeilen,FlagSet{drag,close,depth},
'An diesen Stellen traten Fehler auf');
WriteString(w,'Laufvariable | Fehler',TRUE);
WriteString(w,'----------------------------------------------------------',
TRUE);
Delay(30);
WHILE (NOT closeIt) AND (i<=h) DO
IF (bildspeicher[i].fN#0) AND
(bildspeicher[i].fN#OutOfDefArea) THEN
IF ABS(bildspeicher[i].xWert)>1.0 THEN
RealToStr(bildspeicher[i].xWert,str,6,6)
ELSE
RealToStr(bildspeicher[i].xWert,str,6,-6)
END;
GetFehlertext(bildspeicher[i].fN,text);
WriteString(w,str,FALSE);
WriteString(w,' | ',FALSE);
WriteString(w,text,TRUE);
msgPtr := GetMsg (w^.userPort);
IF msgPtr#NIL THEN
ReplyMsg (msgPtr);
closeIt:=TRUE
END
END;
INC(i,raster)
END;
IF NOT closeIt THEN
WaitPort(w^.userPort)
END;
msgPtr := GetMsg (w^.userPort);
IF msgPtr#NIL THEN
ReplyMsg (msgPtr)
END;
CloseNewWindow(w);
END;
END WriteErrors;
BEGIN
h:=horzRes-1;
v:=vertRes-1;
SetBPen(wPtr^.rPort,backgroundColor);
SetAPen(wPtr^.rPort,drawingColor);
SetDrMd(wPtr^.rPort,jam1);
jjj:=0;
REPEAT
IF bildspeicher[jjj].fN=0 THEN
position:=(v-bildspeicher[jjj].intWert);
Move(wPtr^.rPort,jjj+horzVersch,position+vertVersch)
END;
INC(jjj,raster);
UNTIL (bildspeicher[jjj].fN=0) OR (jjj>=h);
WHILE jjj< h DO
IF (bildspeicher[jjj].fN=0) AND (bildspeicher[jjj-raster].fN=0) THEN
position:=(v-bildspeicher[jjj].intWert);
Draw(wPtr^.rPort,jjj+horzVersch,position+vertVersch)
ELSIF bildspeicher[jjj].fN=0 THEN
position:=(v-bildspeicher[jjj].intWert);
Move(wPtr^.rPort,jjj+horzVersch,position+vertVersch)
END;
INC(jjj,raster);
END;
IF (bildspeicher[h].fN=0) AND
(bildspeicher[jjj-raster].fN=0) THEN
position:=(v-bildspeicher[h].intWert);
Draw(wPtr^.rPort,h+horzVersch,position+vertVersch);
END;
WriteErrors;
END ZeichneFktn;
(*************************************************************************)
PROCEDURE DrawLines;
BEGIN
SetBPen(wPtr^.rPort,backgroundColor);
SetAPen(wPtr^.rPort,textColor);
SetDrMd(wPtr^.rPort,jam1);
IF max <= 0.0 THEN
yLinePos:=0
ELSIF
min >=0.0 THEN yLinePos:=vertRes-1
ELSE
yLinePos:=INTEGER(max/(max-min)*(ffpVertRes-1.0)+0.5);
END;
yLinePos:=yLinePos+vertVersch;
Move(wPtr^.rPort,horzVersch,yLinePos);
Draw(wPtr^.rPort,horzVersch+horzRes-1,yLinePos);
IF startw >= 0.0 THEN
xLinePos:=0
ELSIF
endw <=0.0 THEN xLinePos:=horzRes-1
ELSE
xLinePos:=INTEGER(startw/(startw-endw)*(FFP(horzRes-1))+0.5);
END;
xLinePos:=xLinePos+horzVersch;
Move(wPtr^.rPort,xLinePos,vertVersch);
Draw(wPtr^.rPort,xLinePos,vertRes-1+vertVersch);
END DrawLines;
(*************************************************************************)
PROCEDURE Striche;
CONST
Epsilon1=0.1;
Epsilon2=1.001E-2;
VAR
x,xStep,xPos:FFP;
y,yStep,yPos:FFP;
ixPos,iyPos,pos1,pos2:INTEGER;
dx:FFP;(*Anzahl der Intervalle*)
dy:FFP;
dividiert:BOOLEAN;
i:INTEGER;
BEGIN
SetBPen(wPtr^.rPort,backgroundColor);
IF gitter THEN
SetAPen(wPtr^.rPort,drawingColor)
ELSE
SetAPen(wPtr^.rPort,textColor)
END;
SetDrMd(wPtr^.rPort,jam1);
IF xUnterteilung#255 THEN
dx:=FFP(xUnterteilung)
ELSE
IF ((endw>=0.0) AND (startw>=0.0)) OR ((endw<=0.0) AND (startw<= 0.0)) THEN
dx:=endw-startw
ELSIF
(-startw-endw) >= 0.0
(*(ABS(startw)> ABS(endw)) Compilerfehler*) THEN dx:=-startw
ELSE
dx:=endw
END;
WHILE dx>80.0 DO
dx:=dx*1.0E-1
END;
WHILE dx>20.0 DO (* 20< dx <80 ; teile dx, so das dx ganze Zahl *)
i:=2;dividiert:=FALSE;
REPEAT
x:=dx/FFP(i);
IF (ABS(x-FFP(INTEGER(x+0.5))) < Epsilon1) THEN
dx:=x; dividiert:=TRUE;
END;
INC(i);
UNTIL dividiert OR (i=20);
IF NOT dividiert THEN
dx:=dx*0.5
END;
END;
WHILE dx<2.0 DO
dx:=dx*10.0
END;
WHILE dx<8.0 DO
dx:=dx*2.0
END;
IF ABS(dx-FFP(CARDINAL(dx+0.5))) >= Epsilon2 THEN
dx:=10.0
END;
END;
IF yUnterteilung#255 THEN
dy:=FFP(yUnterteilung)
ELSE
IF ((max>=0.0) AND (min>=0.0)) OR ((max<=0.0) AND (min<= 0.0)) THEN
dy:=max-min
ELSIF
(-min-max) >= 0.0
(*(ABS(min)> ABS(max)) Compilerfehler*) THEN dy:=-min
ELSE
dy:=max
END;
WHILE dy>80.0 DO
dy:=dy*1.0E-1
END;
WHILE dy>20.0 DO
i:=2;dividiert:=FALSE;
REPEAT
y:=dy/FFP(i);
IF (ABS(y-FFP(INTEGER(y+0.5))) < Epsilon1) THEN
dy:=y; dividiert:=TRUE;
END;
INC(i);
UNTIL dividiert OR (i=20);
IF NOT dividiert THEN
dy:=dy*0.5
END;
END;
WHILE dy<2.0 DO
dy:=dy*10.0
END;
WHILE dy<8.0 DO
dy:=dy*2.0
END;
IF ABS(dy-FFP(CARDINAL(dy+0.5))) >= Epsilon2 THEN
dy:=10.0
END;
END;
IF xUnterteilung#0 THEN
IF (xLinePos-horzVersch) >= (horzRes DIV 2) THEN
dx:=FFP(INTEGER(dx+0.5));
xStep:=(FFP(xLinePos-horzVersch))/dx
ELSE
dx:=FFP(INTEGER(dx+0.5));
xStep:=(FFP(horzRes-1+horzVersch-xLinePos)/dx)
END;
END;
IF yUnterteilung#0 THEN
IF (yLinePos-vertVersch) >= (vertRes DIV 2) THEN
dy:=FFP(INTEGER(dy+0.5));
yStep:=(FFP(yLinePos-vertVersch)/dy)
ELSE
dy:=FFP(INTEGER(dy+0.5));
yStep:=(FFP(vertRes-1+vertVersch-yLinePos)/dy)
END;
END;
IF xUnterteilung#0 THEN
IF gitter THEN
pos1:=vertVersch;
pos2:=vertRes-1+vertVersch
ELSE
pos1:=yLinePos-1;
pos2:=yLinePos+1
END;
xPos:=FFP(xLinePos-horzVersch)+xStep;
WHILE (INTEGER(xPos+0.5) <= horzRes) DO
ixPos:=INTEGER(xPos+0.5)+horzVersch;
IF (ixPos=horzRes+horzVersch) THEN DEC(ixPos) END;
Move(wPtr^.rPort,ixPos,pos1);
Draw(wPtr^.rPort,ixPos,pos2);
xPos:=xPos+xStep;
END;
xPos:=FFP(xLinePos-horzVersch)-xStep;
WHILE (INTEGER(xPos+0.5) >= -1) DO
ixPos:=INTEGER(xPos+0.5)+horzVersch;
IF (ixPos=horzVersch-1) THEN INC(ixPos) END;
Move(wPtr^.rPort,ixPos,pos1);
Draw(wPtr^.rPort,ixPos,pos2);
xPos:=xPos-xStep;
END;
END;
IF yUnterteilung#0 THEN
IF gitter THEN
pos1:=horzVersch;
pos2:=horzRes-1+horzVersch
ELSE
pos1:=xLinePos-1;
pos2:=xLinePos+1
END;
yPos:=FFP(yLinePos-vertVersch)+yStep;
WHILE (INTEGER(yPos+0.5) <= vertRes) DO
iyPos:=INTEGER(yPos+0.5)+vertVersch;
IF (iyPos=vertRes+vertVersch) THEN DEC(iyPos) END;
Move(wPtr^.rPort,pos1,iyPos);
Draw(wPtr^.rPort,pos2,iyPos);
yPos:=yPos+yStep;
END;
yPos:=FFP(yLinePos-vertVersch)-yStep;
WHILE (INTEGER(yPos+0.5) >= -1) DO
iyPos:=INTEGER(yPos+0.5)+vertVersch;
IF (iyPos=vertVersch-1) THEN INC(iyPos) END;
Move(wPtr^.rPort,pos1,iyPos);
Draw(wPtr^.rPort,pos2,iyPos);
yPos:=yPos-yStep;
END;
END;
END Striche;
(*************************************************************************)
PROCEDURE NewFunction;
BEGIN
IF DatenEinlesen() THEN
WerteBerechnen;
IF firstTime THEN
IF (minMaxFest OR MinMaxBestimmen()) THEN
Stauchen;
Verschiebung;
DrawLines;
Striche;
ZeichneFktn;
IF beschriftung THEN
Text
END;
firstTime:=FALSE
ELSE
DisplayBeep(wPtr^.wScreen)
END
ELSE
Stauchen;
ZeichneFktn;
END
END;
END NewFunction;
(*************************************************************************)
PROCEDURE DefAreaMinMax(i:TypA);
VAR wPtr:WindowPtr;
fN:CARDINAL;
x1,x2:FFP;
s:Formelstring;
fText:ARRAY[0..80] OF CHAR;
BEGIN
IF (i=mmDef) OR (i=defDef) THEN
IF i=defDef THEN
OpenNewWindow(wPtr,50,50,40,6,FlagSet{drag},
'Definitionsgebiet einschränken')
ELSE
OpenNewWindow(wPtr,50,50,40,6,FlagSet{drag},
'Minimum und Maximum festlegen')
END;
REPEAT
IF i=defDef THEN
ReadString(wPtr,'Untere Grenze: ',s,25)
ELSE
ReadString(wPtr,'Minimum: ',s,30)
END;
IF s[0]#0C THEN
IF DefFormel(9,s,TRUE,onlyLong)=0 THEN
FFPBerechnung(9,x1,fN)
END;
IF fN#0 THEN
GetFehlertext(fN,fText);
WriteString(wPtr,fText,TRUE);
END;
END;
UNTIL (fN=0) OR (s[0]=0C);
IF s[0]#0C THEN
REPEAT
IF i=defDef THEN
ReadString(wPtr,'Obere Grenze: ',s,25)
ELSE
ReadString(wPtr,'Maximum: ',s,30)
END;
IF s[0]#0C THEN
IF DefFormel(9,s,TRUE,onlyLong)=0 THEN
FFPBerechnung(9,x2,fN);
END;
IF fN#0 THEN
GetFehlertext(fN,fText);
WriteString(wPtr,fText,TRUE)
END;
IF x2<=x1 THEN
IF i=defDef THEN
WriteString(wPtr,'Obere Gr. muß größer als untere sein',
TRUE)
ELSE
WriteString(wPtr,'Maximum muß größer als Mimimum sein',
TRUE)
END
END
END;
UNTIL ((fN=0) AND (x1<x2)) OR (s[0]=0C);
END;
CloseNewWindow(wPtr);
IF s[0]#0C THEN
IF i=defDef THEN
def1:=x1;
def2:=x2;
defAreaSet:=TRUE;
ELSE
IF firstTime THEN
minMaxFest:=TRUE;
min:=x1;
max:=x2
END;
newMin:=x1;
newMax:=x2;
minMaxDef:=TRUE
END
END
ELSE
IF i=defVar THEN
defAreaSet:=FALSE
ELSE
minMaxDef:=FALSE
END
END;
END DefAreaMinMax;
(*************************************************************************)
PROCEDURE DrawingColor(n:CARDINAL);
BEGIN
SetAPen(wPtr^.rPort,n);
END DrawingColor;
(*************************************************************************)
PROCEDURE Drawing;
VAR
xyWPtr:WindowPtr;
ffpPos,deltaX,deltaY:FFP;
str:ARRAY[0..Zahlenstellen] OF CHAR;
error:BOOLEAN;
msgPtr:IntuiMessagePtr;
class,oldIDCMP:IDCMPFlagSet;
code:CARDINAL;
xPos,yPos,oldX,oldY,hh1,hh2,hh3:INTEGER;
buttonDown:BOOLEAN;
pointer:ARRAY[0..21] OF CARDINAL;
pDates:ADDRESS;
i:[0..21];
BEGIN
FOR i:=0 TO 21 DO
IF ODD(i) THEN
pointer[i]:=0
ELSE
pointer[i]:=256
END
END;
pointer[0]:=0;
pointer[10]:=7920;
pointer[20]:=0;
IF (ADR(pointer[0])+SIZE(pointer))>=07FFFFH THEN
pDates:=AllocMem(SIZE(pointer),MemReqSet{chip});
CopyMem(ADR(pointer),pDates,SIZE(pointer));
SetPointer(wPtr,pDates,9,16,-8,-4);
ELSE
SetPointer(wPtr,ADR(pointer),9,16,-8,-4)
END;
oldIDCMP:=wPtr^.idcmpFlags;
ModifyIDCMP(wPtr,IDCMPFlagSet{mouseMove,mouseButtons,menuPick,
intuiTicks});
SetBPen(wPtr^.rPort,backgroundColor);
SetDrMd(wPtr^.rPort,jam1);
SetAPen(wPtr^.rPort,drawingColor);
deltaX:=(endw-startw)/FFP(horzRes-1);
deltaY:=(max-min)/FFP(vertRes-1);
hh1:=horzVersch+horzRes-1;
hh2:=vertVersch+vertRes-1;
hh3:=vertRes-1+vertVersch;
buttonDown:=FALSE;
OpenNewWindow(xyWPtr,0,50,11,4,FlagSet{drag,depth},'XY');
ActivateWindow(wPtr);
LOOP
WaitPort(wPtr^.userPort);
msgPtr:=IntuiMessagePtr(REG(0));
(* Waitport liefert im Original einen Pointer auf die erste
IntuiMessage in userPort des Windows. Da das Modula-Waitport
mir diesen Pointer nicht gibt, hole ich ihn mir eben aus
D0, wo Waitport ihn ablegt. Vorher hatte ich auf das Feld
messageKey in der Windowstruktur zugegriffen, um diesen
Pointer zu bekommen, dieser war aber nicht immer identisch mit
dem Pointer, den GetMsg liefert. Warum ???
*)
IF menuPick IN msgPtr^.class THEN
EXIT
ELSE
msgPtr:=GetMsg(wPtr^.userPort);
IF msgPtr#NIL THEN
class:=msgPtr^.class;
code:=msgPtr^.code;
xPos:=msgPtr^.mouseX;
yPos:=msgPtr^.mouseY;
ReplyMsg(msgPtr);
IF intuiTicks IN class THEN
IF (xPos#oldX) OR (yPos#oldY) THEN
oldX:=xPos;
oldY:=yPos;
ClearWindow(xyWPtr);
ValToStr(LONGINT(xPos),FALSE,str,10,3,' ',error);
WriteString(xyWPtr,'h: ',FALSE);
WriteString(xyWPtr,str,TRUE);
ValToStr(LONGINT(yPos),FALSE,str,10,3,' ',error);
WriteString(xyWPtr,'v: ',FALSE);
WriteString(xyWPtr,str,TRUE);
IF NOT firstTime AND (xPos>=horzVersch) AND (xPos<=hh1) THEN
ffpPos:=deltaX*FFP(xPos-horzVersch)+startw;
FFPToStr(ffpPos,str,TRUE);
WriteString(xyWPtr,'x:',FALSE);
WriteString(xyWPtr,str,TRUE)
ELSE
WriteString(xyWPtr,'',TRUE)
END;
IF NOT firstTime AND (yPos>=vertVersch) AND (yPos<=hh2) THEN
ffpPos:=deltaY*FFP(hh3-yPos)+min;
FFPToStr(ffpPos,str,TRUE);
WriteString(xyWPtr,'y:',FALSE);
WriteString(xyWPtr,str,TRUE)
END
END
ELSIF code=selectDown THEN
ReportMouse(wPtr,TRUE);
Move(wPtr^.rPort,xPos,yPos);
buttonDown:=TRUE
ELSIF code=selectUp THEN
ReportMouse(wPtr,FALSE);
buttonDown:=FALSE
END;
IF buttonDown THEN
Draw(wPtr^.rPort,xPos,yPos);
END
END
END
END;
CloseNewWindow(xyWPtr);
ReportMouse(wPtr,FALSE);
ModifyIDCMP(wPtr,oldIDCMP);
ClearPointer(wPtr);
END Drawing;
(*************************************************************************)
PROCEDURE Hardcopy(c:CHAR);
VAR
sSet:SpecialSet;
BEGIN
IF c='s' THEN
DumpRPort(wPtr^.rPort,ADR(wPtr^.wScreen^.viewPort),
0,0,MaxHorzRes,maxVertRes,
MaxHorzRes*standartXSize,
maxVertRes*INTEGER(standartYSize),
density,TRUE,TRUE);
ELSIF c='g' THEN
sSet:=density+ SpecialSet{milCols,milRows,aspect};
DumpRPort(wPtr^.rPort,ADR(wPtr^.wScreen^.viewPort),
0,0,MaxHorzRes,maxVertRes,8000,8000,
sSet,TRUE,TRUE);
ELSE(* c='p'*)
sSet:=density+SpecialSet{fullCols,fullRows,aspect};
DumpRPort(wPtr^.rPort,ADR(wPtr^.wScreen^.viewPort),
0,0,MaxHorzRes,maxVertRes,0,0,
sSet,TRUE,TRUE)
END
END Hardcopy;
(*************************************************************************)
PROCEDURE XYIntervall(i:TypB);
VAR wPtr:WindowPtr;
s:ARRAY[0..5] OF CHAR;
signed,error:BOOLEAN;
l:LONGINT;
msgPtr:IntuiMessagePtr;
BEGIN
IF (i=vertC) OR (i=horzC) THEN
signed:=TRUE;
IF i=vertC THEN
OpenNewWindow(wPtr,50,50,40,4,FlagSet{drag},
'Unterteilung der vert. Achse')
ELSE
OpenNewWindow(wPtr,50,50,40,4,FlagSet{drag},
'Unterteilung der horz.Achse')
END;
ModifyIDCMP(wPtr,(IDCMPFlagSet{closeWindow}+wPtr^.idcmpFlags));
REPEAT
IF i=vertC THEN
ReadString(wPtr,'Intervalle(0-60) ',s,4)
ELSE
ReadString(wPtr,'Intervalle(0-100) ',s,4)
END;
IF s[0]#0C THEN
StrToVal(s,l,signed,10,error);
IF i=vertC THEN
error:=error OR (l<0) OR (l>60)
ELSE
error:=error OR (l<0) OR (l>100)
END;
IF error THEN
WriteString(wPtr,'Wert ist ungültig',TRUE);
END;
END;
UNTIL (NOT error) OR (NOT inputOK) OR (s[0]=0C);
IF (NOT error) AND inputOK AND (s[0]#0C) THEN
IF i=vertC THEN
yUnterteilung:=l
ELSE
xUnterteilung:=l
END
END;
CloseNewWindow(wPtr);
ELSE
IF i=vertV THEN
yUnterteilung:=255
ELSE
xUnterteilung:=255
END
END
END XYIntervall;
(*************************************************************************)
PROCEDURE DrawString;
VAR
qualifier:QualifierSet;
msgPtr:IntuiMessagePtr;
myText:IntuiText;
BEGIN
ModifyIDCMP(wPtr,wPtr^.idcmpFlags+IDCMPFlagSet{mouseButtons});
LOOP
(* alte IntuiMessages vernichten, z.B. IntuiTicks aus Drawing *)
msgPtr:=GetMsg(wPtr^.userPort);
IF msgPtr=NIL THEN
EXIT
ELSE
ReplyMsg(msgPtr)
END
END;
WaitPort(wPtr^.userPort);
msgPtr:=GetMsg (wPtr^.userPort);
IF msgPtr#NIL THEN
qualifier:=msgPtr^.qualifier;
ReplyMsg (msgPtr);
IF (leftButton IN qualifier) AND
(eingaben[0].buffer[0]#0C) THEN
WITH myText DO
frontPen:=textColor;
backPen:=backgroundColor;
drawMode:=jam1;
leftEdge:=0;
topEdge:=0;
iTextFont:=NIL;
iText:=ADR(eingaben[0].buffer);
nextText:=NIL;
END;
PrintIText(wPtr^.rPort,ADR(myText),wPtr^.mouseX,wPtr^.mouseY);
END;
END;
END DrawString;
(*************************************************************************)
PROCEDURE Save;
BEGIN
END Save;
(*************************************************************************)
PROCEDURE Load;
BEGIN
END Load;
(*************************************************************************)
PROCEDURE SetWindowToFront(b:BOOLEAN);
BEGIN
IF b THEN
WindowToFront(wPtr)
ELSE
WindowToBack(wPtr)
END;
END SetWindowToFront;
(*************************************************************************)
BEGIN (*MenuReaction*)
WHILE code#menuNull DO
menuNr:=MenuNum(code);
itemNr:=ItemNum(code);
subNr:=SubNum(code);
CASE menuNr OF
0:CASE itemNr OF
0:NewFunction|
1:ClearScreen|
2:CASE subNr OF
0:DefAreaMinMax(mmVar)|
1:DefAreaMinMax(mmDef)
END|
3:CASE subNr OF
0:DefAreaMinMax(defVar)|
1:DefAreaMinMax(defDef)
END|
4:CASE subNr OF
0:XYIntervall(horzV)|
1:XYIntervall(horzC)
END|
5:CASE subNr OF
0:XYIntervall(vertV)|
1:XYIntervall(vertC)
END|
6:Drawing|
7:DrawString|
8:ende:=TRUE
END|
1:CASE itemNr OF
0:backgroundColor:=subNr|
(*CASE subNr OF
0:backgroundColor:=0|
1:backgroundColor:=1|
2:backgroundColor:=2|
3:backgroundColor:=3
END|
*)
1:drawingColor:=(subNr+1) MOD 4|
(*CASE subNr OF
0:drawingColor:=1|
1:drawingColor:=2|
2:drawingColor:=3|
3:drawingColor:=0
END|
*)
2:textColor:=(subNr+1) MOD 4|
(*CASE subNr OF
0:textColor:=1|
1:textColor:=2|
2:textColor:=3|
3:textColor:=0
END|
*)
3:CASE subNr OF
0:raster:=1|
1:raster:=2|
2:raster:=4|
3:raster:=8
END|
4:CASE subNr OF
0:unit:=rad|
1:unit:=deg|
2:unit:=gon
END|
5:CASE subNr OF
0:gitter:=FALSE|
1:gitter:=TRUE
END|
6:CASE subNr OF
0:rahmen:=TRUE|
1:rahmen:=FALSE
END|
7:CASE subNr OF
0:beschriftung:=TRUE|
1:beschriftung:=FALSE
END|
END|
2:CASE itemNr OF
0:Load|
1:Save|
2:Hardcopy('s')|
3:Hardcopy('g')|
4:Hardcopy('p')|
5:CASE subNr OF
0:density:=SpecialSet{}|
1:density:=SpecialSet{density1}|
2:density:=SpecialSet{density2}|
3:density:=SpecialSet{density1,density2}|
4:density:=SpecialSet{density4}|
END|
6:standartXSize:=subNr+1|
(*CASE subNr OF
0:standartXSize:=1|
1:standartXSize:=2|
2:standartXSize:=3|
3:standartXSize:=4|
END|
*)
7:standartYSize:=subNr+1|
(*CASE subNr OF
0:standartYSize:=1|
1:standartYSize:=2|
2:standartYSize:=3|
3:standartYSize:=4|
END|
*)
END|
3:CASE itemNr OF
0:SetWindowToFront(FALSE)|
1:SetWindowToFront(TRUE)
END
END;
menuIPtr:=ItemAddress(firstMenu,code);
code:=menuIPtr^.nextSelect;
END;
END MenuReaction;
(*************************************************************************)
BEGIN
ende:=FALSE;
WaitPort(wPtr^.userPort);
msgPtr:=GetMsg (wPtr^.userPort);
IF msgPtr <> NIL THEN
class:=msgPtr^.class;
code :=msgPtr^.code;
ReplyMsg(msgPtr);
IF class=IDCMPFlagSet{menuPick} THEN
MenuReaction
END
END
END RespondMessage;
(*************************************************************************)
BEGIN
wPtr:=NIL;
TermProcedure(CleanupGraph);
Init;
OpenGraphicWindow;
actWSize:= wPtr^.wScreen^.height;
SizeWindow(wPtr,0,actWSize-maxVertRes);
InitGraphicmenu;
IF SetMenuStrip(wPtr,firstMenu) THEN END;
maxVertRes:=actWSize;
CharSize(charWidth,charHeight);
horzRes:=MaxHorzRes-charWidth*Zahlenstellen-zwei*2;
IF NOT ODD(horzRes) THEN
DEC(horzRes)
END;
vertRes:=maxVertRes-charHeight-zwei*2;
IF NOT ODD(vertRes) THEN (* Damit die x-Achse, wenn sie in der Mitte liegt
auch wirklich in der Mitte liegt *)
DEC(vertRes)
END;
ffpVertRes:=FFP(vertRes);
ClearScreen;
REPEAT
RespondMessage;
UNTIL ende;
CleanupGraph;
END Graf;
BEGIN
WITH eingaben[0] DO
buffer:='';
text:='Funktion:';
sichtbareZeichen:=40;
END;
WITH eingaben[1] DO
buffer:='';
text:='Laufvariable:';
sichtbareZeichen:=2;
END;
WITH eingaben[2] DO
buffer:='';
text:='Startwert:';
sichtbareZeichen:=20;
END;
WITH eingaben[3] DO
buffer:='';
text:='Endwert:';
sichtbareZeichen:=20;
END;
END Graph.mod